package session;

import java.io.File;
import java.sql.Time;
import java.util.Date;
import java.util.List;
import javax.ejb.Remote;

import entity.*;
import java.util.Map;

@Remote
public interface ElectionManagementItf {

    //Guillaume
    /**
     *      * Méthode permettant de modifier le mot de passe d'un acteur      *
     *     
     *
     * @param  ancmdp      *        
     * <code>String</code> représentant l'ancien mot de passe qu'on veut
     * modifier      *     
     * @param  nvmdp      *        
     * <code>String</code> représentant le nouveau de mot de passe à appliquer
     * au compte d'un acteur      *      *     
     * @return
     * <code>boolean</code> : returne <b>true</b> si la modification s'est bien
     * réalisée      * ou <b>false</b> si l'opération a échoué      *      *
     *     
     */
    public boolean modifierMDP(String ancmdp, String nvmdp);

    //Guillaume
    /**
     *      * Méthode permettant de consulter les électeurs d'un Collège donné
     *      *     
     *
     * @param  idCollege      *        
     * <code>int</code> représentant l'id du collège pour laquelle on dédire
     * avoir des informations      *     
     * @return
     * <code>Map<Integer, List<String>></code> :     
     * <code>int</code> : retourne la valeur du champ clé "idElecteur"      *
     *     
     * <code>String</code> : retourne la valeur du champ clé "nom"      *     
     * <code>String</code> : retourne la valeur du champ clé "prenom"      *
     *      *      *     
     */
    public Map<Integer, List<String>> consulterElecteursCollege(int idCollege);

    //Guillaume
    /**
     *      * Méthode permettant de consulter la liste de tous les profils     
     * *      *     
     *
     * @return
     * <code>Map<Integer,String></code> :     
     * <code>int</code> : retourne la valeur du champ clé "idProfil"      *     
     * <code>String</code> : retourne la valeur du champ clé "libelle"      *
     *      *     
     */
    public Map<Integer, String> consulterProfils();

    //Guillaume
    /**
     *      * Méthode permettant de consulter les collèges participant à une
     * élection donnée      *     
     *
     * @param  idElection      *        
     * <code>int</code> représentant l'id du collège pour laquelle on dédire
     * avoir des informations      *     
     * @return
     * <code>Map<Integer, String></code> :     
     * <code>int</code> : retourne la valeur du champ clé "idCollege"      *
     *     
     * <code>String</code> : retourne la valeur du champ clé "libelle"      *
     *      *      *     
     */
    public Map<Integer, String> consulterCollegesElection(int idElection);

    //Guillaume
    /**
     *      * Méthode permettant de consulter les informations concernant une
     * élection donnée      *     
     *
     * @param  idelec      *        
     * <code>int</code> représentant l'id de l'élection pour laquelle on dédire
     * avoir des informations      *     
     * @return
     * <code>Map<String,Objet></code> :     
     * <code>String</code> : retourne la valeur du champ clé "libelle"      *
     *     
     * <code>int</code> : retourne la valeur du champ clé "idElection"      *
     *     
     * <code>String</code> : retourne la valeur du champ clé "dateDebut"      *
     *     
     * <code>String</code> : retourne la valeur du champ clé "dateFin"      *
     *     
     * <code>List(String)</code> : retourne la valeur du champ clé "bureaux"
     *      *     
     * <code>List(String)</code> : retourne la valeur du champ clé "collèges"
     *      *      *     
     */
    public Map<String, Object> consulterElection(int idelec);

    //Guillaume
    /**
     *      * Méthode permettant d'avoir la liste des élections avec leur id et
     * leur libelle      *      *     
     *
     * @return
     * <code>Map<Integer, String></code> :     
     * <code>int</code> : retourne la valeur du champ clé "idElection"      *
     *     
     * <code>String</code> : retourne la valeur du champ clé "libelle"      *
     *      *     
     */
    public Map<Integer, String> consulterElections();

    public boolean importer(File f);
    //fichier excel
    //insère en base le fichier excel des electeurs
    //permet la création de tous les electeurs pour un college donnee
    // EN GROS : création d'un collège

    //Later
    public void Imprimer(int idelection);

    //exporte une liste d'élection via un fichier excel: Later
    public File exporter(int idelection, String path);

    //Nafi
    /**
     *      * Méthode permettant de créer une election      *     
     *
     * @param  libelle      *        
     * <code>String</code> représentant le libelle que l'on souhaite donné à
     * l'élection      *     
     * @param  deb      *        
     * <code>Date</code> représentant la date de début de l'élection      *     
     * @param  fin      *        
     * <code>Date</code> représentant la date de fin de l'élection      *     
     * @param  burList      *        
     * <code>List(Integer)</code> représentant la liste des bureaux où se
     * déroulent l'élection      *     
     * @param  colgList      *        
     * <code>List(Integer)</code> représentant la liste des collèges qui
     * participent à l'élection      *     
     * @return
     * <code>boolean</code> : returne <b>true</b> si la création s'est bien
     * réalisée      * ou <b>false</b> si l'opération a échoué      *      *
     *     
     */
    public boolean creerElection(String libelle, Date deb, Date fin, List<Integer> burList, List<Integer> colgList);

    //Nafi
    /**
     *      * Méthode permettant de modifier une election      *     
     *
     * @param  id_Elec      *        
     * <code>int</code> représentant l'id de l'élection que l'on souhaite
     * modifier      *     
     * @param  libelle      *        
     * <code>String</code> représentant le libelle de l'élection que l'on
     * souhaite modifier      *     
     * @param  deb      *        
     * <code>Date</code> représentant la date de début de l'élection que l'on
     * souhaite modifier      *     
     * @param  fin      *        
     * <code>Date</code> représentant la date de fin de l'élection que l'on
     * souhaite modifier      *     
     * @return
     * <code>boolean</code> : returne <b>true</b> si la modification s'est bien
     * réalisée      * ou <b>false</b> si l'opération a échoué      *      *
     *     
     */
    public boolean modifierElection(int id_Elec, String libelle, Date deb, Date fin);

    //Inès
    /**
     *      * Méthode permettant de créer un bureau      *     
     *
     * @param  nom      *        
     * <code>String</code> représentant le nom que l'on souhaite donné au bureau
     *      *     
     * @param  adresse      *        
     * <code>String</code> représentant l'adresse du bureau      *     
     * @param  houv      *        
     * <code>String</code> représentant l'heure d'ouverture du bureau      *
     *     
     * @param  hfin      *        
     * <code>String</code> représentant l'heure de fermeture du bureau      *
     *     
     * @return
     * <code>boolean</code> : returne <b>true</b> si la création s'est bien
     * réalisée      * ou <b>false</b> si l'opération a échoué      *      *
     *     
     */
    public boolean creerBureau(String nom, String adresse, String houv, String hfin);

    //Inès
    /**
     *      * Méthode permettant de modifier d'un bureau      *     
     *
     * @param  idbur      *        
     * <code>int</code> représentant l'id du bureau que l'on souhaite modifier
     *      *     
     * @param  nom      *        
     * <code>String</code> représentant le nom du bureau que l'on souhaite
     * modifier      *     
     * @param  adresse      *        
     * <code>String</code> représentant l'adresse du bureau que l'on souhaite
     * modifier      *     
     * @param  houv      *        
     * <code>String</code> représentant l'heure d'ouverture du bureau que l'on
     * souhaite modifier      *     
     * @param  hfin      *        
     * <code>String</code> représentant l'heure de fin du bureau que l'on
     * souhaite modifier      *     
     * @return
     * <code>boolean</code> : returne <b>true</b> si la modification s'est bien
     * réalisée      * ou <b>false</b> si l'opération a échoué      *      *
     *     
     */
    public boolean modifierBureau(int idbur, String nom, String adresse, String houv, String hfin);

    //Inès
    /**
     *      * Méthode permettant de modifier un électeur      *     
     *
     * @param  idElecteur      *        
     * <code>int</code> représentant l'id de l'électeur que l'on souhaite
     * modifier      *     
     * @param  nom      *        
     * <code>String</code> représentant le nom de l'électeur que l'on souhaite
     * modifier      *     
     * @param  prenom      *        
     * <code>String</code> représentant le prénom de l'électeur que l'on
     * souhaite modifier      *     
     * @param  adresse      *        
     * <code>String</code> représentant l'adresse de l'électeur que l'on
     * souhaite modifier      *      *     
     * @return
     * <code>boolean</code> : returne <b>true</b> si la modification s'est bien
     * réalisée      * ou <b>false</b> si l'opération a échoué      *      *
     *     
     */
    public boolean modifierElecteur(int idElecteur, String nom, String prenom, Date datenaiss,
            String composante, String adresse);

    //Later
    public boolean envoyerMail(String message, int idact);

    //Estelle
    /**
     *      * Méthode permettant de créer un acteur      *     
     *
     * @param  idProfil      *        
     * <code>int</code> représentant l'id du profil auquel on veut associer
     * l'acteur      *     
     * @param  nom      *        
     * <code>String</code> représentant le nom de l'acteur      *     
     * @param  prenom      *        
     * <code>String</code> représentant le prénom a date de fin de l'élection
     * que l'on souhaite modifier      * de l'acteur      *     
     * @param  login      *        
     * <code>String</code> représentant le login de l'acteur      *     
     * @param  mdp      *        
     * <code>Date</code> représentant le mot de passe de l'acteur      *     
     * @return
     * <code>boolean</code> : returne <b>true</b> si la création s'est bien
     * réalisée      * ou <b>false</b> si l'opération a échoué      *      *
     *     
     */
    public boolean creerActeur(String nom, String prenom, String login, String mdp, int idProfil);

    //Estelle
    /**
     *      * Méthode permettant de modifier un acteur      *     
     *
     * @param  idActeur      *        
     * <code>int</code> représentant l'id de l'acteur à modifier      *     
     * @param  nom      *        
     * <code>String</code> représentant le nom de l'acteur que l'on souhaite
     * modifier      *     
     * @param  prenom      *        
     * <code>String</code> représentant le prénom de l'acteur que l'on souhaite
     * modifier      *     
     * @param  login      *        
     * <code>String</code> représentant le login de l'acteur que l'on souhaite
     * modifier      *     
     * @param  mdp      *        
     * <code>String</code> représentant le mot de passe de l'acteur que l'on
     * souhaite modifier      *     
     * @param  idProfil      *        
     * <code>int</code> représentant l'id du profil auquel est relié l'acteur
     * que l'on souhaite modifier      *     
     * @return
     * <code>boolean</code> : returne <b>true</b> si la modification s'est bien
     * réalisée      * ou <b>false</b> si l'opération a échoué      *      *
     *     
     */
    public boolean modifierActeur(int id_Act, String nom, String prenom, String login, String mdp, int idProfil);

    //Guillaume
    /**
     *      * Méthode permettant de supprimer un acteur      *     
     *
     * @param  idActeur      *        
     * <code>int</code> représentant l'id de l'acteur à modifier      *     
     * @return
     * <code>boolean</code> : returne <b>true</b> si la suppression s'est bien
     * réalisée      * ou <b>false</b> si l'opération a échoué      *      *
     *     
     */
    public boolean supprimerActeur(int idActeur);

    /**
     *      * Méthode permettant de mettre à jour le rôle d'un acteur      *
     *     
     *
     * @param  idActeur      *        
     * <code>int</code> représentant l'id de l'acteur      *     
     * @param  idProfil      *        
     * <code>int</code> représentant l'id du profil auquel est relié l'acteur
     *      *     
     * @return
     * <code>boolean</code> : returne <b>true</b> si la mise à jour s'est bien
     * réalisée      * ou <b>false</b> si l'opération a échoué      *      *
     */
    public boolean majRoleActeur(int idActeur, int idProfil);

    //Guillaume
    /**
     *      * Méthode permettant à un acteur de s'authentifier      *     
     *
     * @param  login      *        
     * <code>String</code> représentant le login de l'acteur      *     
     * @param  mdp      *        
     * <code>String</code> représentant le mot de passe de l'acteur      *     
     * *     
     * @return
     * <code>int</code> : retourne l'id de l'acteur si l'authentification s'est
     * bien passé      * ou retourne -1 si l'opération a échoué      *      *
     *     
     */
    public int authActeur(String login, String mdp);

    //Guillaume
    /**
     *      * Méthode permettant de consulter les informations concernant un
     * acteur donnée      *     
     *
     * @param  idActeur      *        
     * <code>int</code> représentant l'id de l'acteur pour laquelle on dédire
     * avoir des informations      *     
     * @return
     * <code>Map<String,Objet></code> :     
     * <code>String</code> : retourne la valeur du champ clé "login"      *     
     * <code>String</code> : retourne la valeur du champ clé "mdp"      *     
     * <code>String</code> : retourne la valeur du champ clé "nom"      *     
     * <code>String</code> : retourne la valeur du champ clé "prenom"      *
     *     
     * <code>int</code> : retourne la valeur du champ clé "idProfil"      *     
     * <code>String</code> : retourne la valeur du champ clé "libelleProfil"
     *      *      *     
     */
    public Map<String, Object> consulterActeur(int id);

    //Guillaume
    /**
     *      * Méthode permettant de consulter la liste de tous les acteurs     
     * *      *     
     *
     * @return
     * <code>Map<Integer,List(String)></code> :      *     
     * <code>int</code> : retourne la valeur du champ clé "idActeur"      *     
     * <code>List(String)</code> : retourne la valeur du champ clé "adresse"
     *      *     
     * <code>String</code> : retourne la valeur du champ clé "heureOuverture"
     *      *     
     * <code>String</code> : retourne la valeur du champ clé "heureFermeture"
     *      *     
     * <code>List(String)</code> : retourne la valeur du champ clé "elections"
     *      *      *     
     */
    public Map<Integer, List<String>> consulterActeurs();

    //Guillaume
    /**
     *      * Méthode permettant de consulter la liste de tous les bureaux     
     * *      *     
     *
     * @return
     * <code>Map<Integer,String></code> :     
     * <code>String</code> : retourne la valeur du champ clé "nom"      *     
     * <code>int</code> : retourne la valeur du champ clé "idBureau"      *     
     * <code>String</code> : retourne la valeur du champ clé "adresse"      *
     *     
     * <code>String</code> : retourne la valeur du champ clé "heureOuverture"
     *      *     
     * <code>String</code> : retourne la valeur du champ clé "heureFermeture"
     *      *     
     * <code>List(String)</code> : retourne la valeur du champ clé "elections"
     *      *      *     
     */
    public Map<Integer, String> consulterBureaux();

    //Guillaume
    /**
     *      * Méthode permettant de consulter la liste de tous les collèges     
     * *     
     *
     * @return
     * <code>Map<Integer,String></code> :     
     * <code>String</code> : retourne la valeur du champ clé "libelle"      *
     *     
     * <code>int</code> : retourne la valeur du champ clé "idCollege"      *
     *      *     
     */
    public Map<Integer, String> consulterColleges();

    //Guillaume
    /**
     *      * Méthode permettant de consulter les informations concernant une
     * élection donnée      *     
     *
     * @return
     * <code>Map<Integer,List(String)></code> :     
     * <code>List(String)</code> : retourne la valeur du champ clé "libelle"
     *      *     
     * <code>int</code> : retourne la valeur des champs clés : "nom" et "prenom"
     *      *      *     
     */
    public Map<Integer, List<String>> consulterElecteurs();

    //Guillaume
    public boolean ajouterCollegeElection(int idElection, int idCollege);

    //Guillaume
    public boolean ajouterBureauElection(int idElection, int idBureau);

    //Guillaume
    /**
     * Méthode permettant de supprimer un collège d'une élection      *     
     *
     * @param  idElection      *        
     * <code>int</code> représentant l'id de l'élection concernée
     * @param  idCollege      *        
     * <code>int</code> représentant l'id du collège à supprimer
     *
     *      *     
     * @return
     * <code>boolean</code> : returne <b>true</b> si la suppression s'est bien
     * réalisée      * ou <b>false</b> si l'opération a échoué      *      *
     *     
     */
    public boolean supprimerCollegeElection(int idElection, int idCollege);

    //Guillaume
    /**
     * Méthode permettant de supprimer un bureau d'une élection      *     
     *
     * @param  idElection      *        
     * <code>int</code> représentant l'id de l'élection concernée
     * @param  idBureau      *        
     * <code>int</code> représentant l'id du bureau à supprimer
     *
     *      *     
     * @return
     * <code>boolean</code> : returne <b>true</b> si la suppression s'est bien
     * réalisée      * ou <b>false</b> si l'opération a échoué      *      *
     *     
     */
    public boolean supprimerBureauElection(int idElection, int idBureau);

    //Guillaume
    /**
     *      * Méthode permettant de consulter les informations d'un bureau donné
     *     
     *
     * @param  idbur      *        
     * <code>int</code> représentant l'id du bureau pour lequel on désire avoir
     * des informations      *     
     * @return
     * <code>Map<String,Objet></code> :     
     * <code>int</code> : retourne la valeur du champ clé "idBureau"      *     
     * <code>String</code> : retourne la valeur du champ clé "libelle"      *
     *      *      *     
     */
    public Map<String, Object> consulterBureau(int idbur);

    //Guillaume
    /*
     * Méthode permettant de supprimer une élection      *      * @param 
     * idElection      *         <code>int</code> représentant l'id de
     * l'élection à modifier      *      * @return <code>boolean</code> :
     * returne <b>true</b> si la suppression s'est bien réalisée      * ou
     * <b>false</b> si l'opération a échoué      *      *     
     */
    public boolean supprimerElection(int idElection);

    //Guillaume
    /**
     *      * Méthode permettant de créer un collège      *     
     *
     * @param  libelle      *        
     * <code>String</code> représentant le libelle que l'on souhaite donné au
     * collège      *     
     * @param  f      *        
     * <code>File</code> représentant le fichier avec les infos du collège     
     * *     
     * @return
     * <code>boolean</code> : returne <b>true</b> si la création s'est bien
     * réalisée      * ou <b>false</b> si l'opération a échoué      *      *
     *     
     */
    public boolean creerCollege(File f, String libelle);

    //Guillaume
    /**
     *      * Méthode permettant de créer un électeur      *     
     *
     * @param  nom      *        
     * <code>String</code> représentant le nom que l'on souhaite donné à
     * l'électeur      *     
     * @param  prenom      *        
     * <code>String</code> représentant le prénom que l'on souhaite donner à
     * l'électeur      *     
     * @param  datenaiss      *        
     * <code>Date</code> représentant la date de naissance de l'électeur      *
     *     
     * @param  composante      *        
     * <code>String</code> représentant la composante de l'électeur      *     
     * @param  adresse      *        
     * <code>String</code> représentant l'adresse de l'électeur     
     *
     * @param  idcat      *        
     * <code>int</code> représentant l'id catégorie de l'électeur     
     * @return
     * <code>boolean</code> : returne <b>true</b> si la création s'est bien
     * réalisée      * ou <b>false</b> si l'opération a échoué      *      *
     *     
     */
    public boolean creerElecteur(String nom, String prenom, Date datenaiss, String composante, String adresse, int idcat);

    //Guillaume
    /**
     *      * Méthode permettant de consulter les informations des bureaux d'une
     * élection donnée      *     
     *
     * @param  idElection      *        
     * <code>int</code> représentant l'id de l'élection pour laquelle on dédire
     * avoir des informations      *     
     * @return
     * <code>Map<Integer,String></code> :     
     * <code>int</code> : retourne la valeur du champ clé "idBureau"      *     
     * <code>String</code> : retourne la valeur du champ clé "nom"      *      *
     *     
     */
    public Map<Integer, String> consulterBureauxElection(int idElection);

    //Ines (en suspens )
    /**
     *      * Méthode permettant de consulter les informations concernant un
     * électeur donné      *     
     *
     * @param  idElecteur      *        
     * <code>int</code> représentant l'id de l'électeur pour laquelle on dédire
     * avoir des informations      *     
     * @return
     * <code>Map<String,Objet></code> :     
     * <code>String</code> : retourne la valeur du champ clé "login"      *     
     * <code>String</code> : retourne la valeur du champ clé "mdp"      *     
     * <code>String</code> : retourne la valeur du champ clé "nom"      *     
     * <code>String</code> : retourne la valeur du champ clé "prenom"      *
     *     
     * <code>int</code> : retourne la valeur du champ clé "idProfil"      *     
     * <code>String</code> : retourne la valeur du champ clé "libelleProfil"
     *      *      *     
     */
    public Map<String, Object> consulterElecteur(int idElecteur);

    /**
     *      * Méthode permettant de vérifier l'unicité d'un login en base.     
     * *     
     *
     * @param  Login      *        
     * <code>String</code> représentant le login de l'acteur dont on souhaite
     * verifier l'unicité.      *     
     * @return      *     
     * <code>boolean</code> : retourne vrai si le login est unique, false sinon.
     *      *      *     
     */
    public boolean verifLogin(String login);

    /**
     *      * Méthode permettant de consulter l'identifiant d'un college     
     * *     
     *
     * @param  libelle      *        
     * <code>String</code> le libelle du college dont on cherche l'id.      *     
     * @return      *     
     * <code>int</code>  l'id du collège recherché. Retourne -1 si le collège n'existe pas.
     *      *      *     
     */    
    public int consulterIdCollege(String libelle);

     /**
     *      * Méthode permettant de consulter l'identifiant d'un college     
     * *     
     *
     * @param  libelle      *        
     * <code>String</code> le libelle du college que l'on veut créer      *     
     * @return      *     
     * <code>boolean</code>  renvoi true si la création s'est bien passé et false sinon.
     *      *      *     
     */    
    public boolean creerCollege(String libelle);

    
    /**
     *      * Méthode permettant de consulter l'identifiant d'un electeur     
     * *     
     *
     * @param  nom      *        
     * <code>String</code> nom de l'électeur recherché      *
     * 
     * @param  prenom     *        
     * <code>String</code> prenom de l'électeur recherché     *
     * 
     * @param  datenaiss      *        
     * <code>Date</code> date de naissance de l'électeur recherché      *
     * 
     * @param  composante      *        
     * <code>String</code> composante de l'électeur recherché      *
     * 
     * @param  adresse     *        
     * <code>String</code> adresse de l'électeur recherché      *
     *     
     * @return      *     
     * <code>int</code>  l'id de l'électeur recherché. Retourne -1 si le collège n'existe pas.
     *      *      *     
     */    
    public int consulterIdElecteur(String nom, String prenom, Date datenaiss, String composante, String adresse);

    /**
     *      * Méthode permettant d'ajouter les electeurs d'un college à une election.    
     * *     
     *
     * @param  idElection      *        
     * <code>int</code> id de l'election à laquelle on va inscrire les electeurs      *
     * 
     * @param  idCollege    *        
     * <code>int</code> id du college d'electeurs, et donc de l'ensemble d'electeurs à ajouter à l'élection.   *
     *      
     * @return      *     
     * <code>boolean</code>  returne true si l'ajout s'est bien déroulé, false sinon.
     *      *      *     
     */   
    public boolean ajouterElecteursElection(int idElection, int idCollege);

    /**
     *      * Méthode permettant d'associer un electeur à une élection et de l'insérer dans la liste d'émargement de cette élection.     
     * *     
     *
     * @param  idElection      *        
     * <code>int</code> id de l'election à laquelle on va inscrire l'électeur      *
     * 
     * @param  idElecteur    *        
     * <code>int</code> id de l'electeur à inscrire à l'élection.   *
     *      
     * @return      *     
     * <code>boolean</code>  returne true si l'ajout s'est bien déroulé, false si l'electeur est déjà inscrit ou qu'un identifiant n'existe pas.
     *      *      *     
     */  
    public boolean creerParticipation(int idElection, int idElecteur);
    
    public File exporter(int idElection, File f);
}
